package com.ly.demo.classdemo;

/**
 * @author liuyang
 * @des Java的多态性机制导致了引用变量的声明类型和其实际引用的类型可能不一致，在结合动态方法调度机制可以得出结论：
 * 声明为同种类型的两个引用变量调用同一个方法时也可能会有不同的行为。为更准确的鉴别一个对象的真正类型，Java语言引入了instanceof操作符。
 * <p>
 * 定义: instanceof关键字是用于判断一个引用类型变量所指向的对象是否是一个类（或接口、抽象类、父类）的实例。
 * 使用格式 : <引用类型变量> instanceof <引用类型>
 * 注意：该表达式为Boolean类型的表达式，当instanceof左侧的引用类型变量所引入对象的实际类型是其右侧给出的类型或是其子类类型时，整个表达式的结果为true，否则为false。例如mi instanceof MyClass。
 * 子类对象 instanceof 父类，返回true
 * 父类对象 instanceof 子类，返回false
 * 如果两个类不在同一继承家族中，是用instanceof时会出现错误
 * 数组类型也可以使用instanceof来比较
 * @Version 1.0
 * @Date: 05/08/2021 10:04
 */
public class InstanceofDemo {
    public static void main(String[] args) {
        Person pobj1 = new Person("tom");
        Student sobj1 = new Student("Daming", 5);
        typeof(pobj1);
        System.out.println("-------------------");
        typeof(sobj1);
        System.out.println("-------------------");
        String[] str = new String[2];
        if (str instanceof String[]) {
            System.out.println("true! ");
        }
    }

    public static void typeof(Object obj) {
        if (obj instanceof Student) {
            System.out.println(((Student)obj).name + " is Student!");
        }
        if (obj instanceof Person) {
            System.out.println(((Person)obj).name + " is Person!");
        }
    }
}
